home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / cpu / z80gb / z80gbd.c < prev   
C/C++ Source or Header  |  2000-01-08  |  16KB  |  345 lines

  1. /*****************************************************************************
  2.  *
  3.  *     z80gbd.c
  4.  *     Portable Z80 Gameboy disassembler
  5.  *
  6.  *     Copyright (C) 2000 by The MESS Team.
  7.  *
  8.  *     - This source code is released as freeware for non-commercial purposes.
  9.  *     - You are free to use and redistribute this code in modified or
  10.  *       unmodified form, provided you list me in the credits.
  11.  *     - If you modify this source code, you must add a notice to each modified
  12.  *       source file that it has been changed.  If you're a nice person, you
  13.  *       will clearly mark each change too.  :)
  14.  *     - If you wish to use this for commercial purposes, please contact me at
  15.  *       pullmoll@t-online.de
  16.  *     - The author of this copywritten work reserves the right to change the
  17.  *     terms of its usage and license at any time, including retroactively
  18.  *   - This entire notice must remain in the source code.
  19.  *
  20.  *****************************************************************************/
  21.  
  22. #include <stdio.h>
  23. #include <string.h>
  24. #ifdef    MAME_DEBUG
  25. #include "driver.h"
  26. #include "mamedbg.h"
  27. #include "z80gb.h"
  28.  
  29. enum e_mnemonics {
  30.     zADC,  zADD,  zAND,  zBIT,    zCALL, zCCF,  zCP,
  31.     zCPL,  zDAA,  zDB,     zDEC,    zDI,   zEI,   zHLT,
  32.     zIN,   zINC,  zJP,     zJR,    zLD,   zNOP,  zOR,
  33.     zPOP,  zPUSH, zRES,  zRET,    zRETI, zRL,   zRLA,
  34.     zRLC,  zRLCA, zRR,     zRRA,    zRRC,  zRRCA, zRST,
  35.     zSBC,  zSCF,  zSET,  zSLA,    zSLL,  zSRA,  zSRL,
  36.     zSTOP, zSUB,  zXOR
  37. };
  38.  
  39. static char *s_mnemonic[] = {
  40.     "adc", "add", "and", "bit", "call","ccf", "cp",
  41.     "cpl", "daa", "db",  "dec", "di",  "ei",  "halt",
  42.     "in",  "inc", "jp",  "jr",  "ld",  "nop", "or",
  43.     "pop", "push","res", "ret", "reti","rl",  "rla",
  44.     "rlc", "rlca","rr",  "rra", "rrc", "rrca","rst",
  45.     "sbc", "scf", "set", "sla", "sll", "sra", "srl",
  46.     "stop","sub", "xor"
  47. };
  48.  
  49. typedef struct {
  50.     UINT8    access;
  51.     UINT8    mnemonic;
  52.     const char *arguments;
  53. }    z80gbdasm;
  54.  
  55. #define _0    EA_NONE
  56. #define _JP EA_ABS_PC
  57. #define _JR EA_REL_PC
  58. #define _RM EA_MEM_RD
  59. #define _WM EA_MEM_WR
  60. #define _RW EA_MEM_RDWR
  61. #define _RP EA_PORT_RD
  62. #define _WP EA_PORT_WR
  63.  
  64. static z80gbdasm mnemonic_cb[256] = {
  65.     {_0, zRLC,"b"},     {_0, zRLC,"c"},     {_0, zRLC,"d"},     {_0, zRLC,"e"},
  66.     {_0, zRLC,"h"},     {_0, zRLC,"l"},     {_RW,zRLC,"(hl)"},  {_0, zRLC,"a"},
  67.     {_0, zRRC,"b"},     {_0, zRRC,"c"},     {_0, zRRC,"d"},     {_0, zRRC,"e"},
  68.     {_0, zRRC,"h"},     {_0, zRRC,"l"},     {_RW,zRRC,"(hl)"},  {_0, zRRC,"a"},
  69.     {_0, zRL,"b"},      {_0, zRL,"c"},      {_0, zRL,"d"},      {_0, zRL,"e"},
  70.     {_0, zRL,"h"},      {_0, zRL,"l"},      {_RW,zRL,"(hl)"},   {_0, zRL,"a"},
  71.     {_0, zRR,"b"},      {_0, zRR,"c"},      {_0, zRR,"d"},      {_0, zRR,"e"},
  72.     {_0, zRR,"h"},      {_0, zRR,"l"},      {_RW,zRR,"(hl)"},   {_0, zRR,"a"},
  73.     {_0, zSLA,"b"},     {_0, zSLA,"c"},     {_0, zSLA,"d"},     {_0, zSLA,"e"},
  74.     {_0, zSLA,"h"},     {_0, zSLA,"l"},     {_RW,zSLA,"(hl)"},  {_0, zSLA,"a"},
  75.     {_0, zSRA,"b"},     {_0, zSRA,"c"},     {_0, zSRA,"d"},     {_0, zSRA,"e"},
  76.     {_0, zSRA,"h"},     {_0, zSRA,"l"},     {_RW,zSRA,"(hl)"},  {_0, zSRA,"a"},
  77.     {_0, zSLL,"b"},     {_0, zSLL,"c"},     {_0, zSLL,"d"},     {_0, zSLL,"e"},
  78.     {_0, zSLL,"h"},     {_0, zSLL,"l"},     {_RW,zSLL,"(hl)"},  {_0, zSLL,"a"},
  79.     {_0, zSRL,"b"},     {_0, zSRL,"c"},     {_0, zSRL,"d"},     {_0, zSRL,"e"},
  80.     {_0, zSRL,"h"},     {_0, zSRL,"l"},     {_RW,zSRL,"(hl)"},  {_0, zSRL,"a"},
  81.     {_0, zBIT,"0,b"},   {_0, zBIT,"0,c"},   {_0, zBIT,"0,d"},   {_0, zBIT,"0,e"},
  82.     {_0, zBIT,"0,h"},   {_0, zBIT,"0,l"},   {_RM,zBIT,"0,(hl)"},{_0, zBIT,"0,a"},
  83.     {_0, zBIT,"1,b"},   {_0, zBIT,"1,c"},   {_0, zBIT,"1,d"},   {_0, zBIT,"1,e"},
  84.     {_0, zBIT,"1,h"},   {_0, zBIT,"1,l"},   {_RM,zBIT,"1,(hl)"},{_0, zBIT,"1,a"},
  85.     {_0, zBIT,"2,b"},   {_0, zBIT,"2,c"},   {_0, zBIT,"2,d"},   {_0, zBIT,"2,e"},
  86.     {_0, zBIT,"2,h"},   {_0, zBIT,"2,l"},   {_RM,zBIT,"2,(hl)"},{_0, zBIT,"2,a"},
  87.     {_0, zBIT,"3,b"},   {_0, zBIT,"3,c"},   {_0, zBIT,"3,d"},   {_0, zBIT,"3,e"},
  88.     {_0, zBIT,"3,h"},   {_0, zBIT,"3,l"},   {_RM,zBIT,"3,(hl)"},{_0, zBIT,"3,a"},
  89.     {_0, zBIT,"4,b"},   {_0, zBIT,"4,c"},   {_0, zBIT,"4,d"},   {_0, zBIT,"4,e"},
  90.     {_0, zBIT,"4,h"},   {_0, zBIT,"4,l"},   {_RM,zBIT,"4,(hl)"},{_0, zBIT,"4,a"},
  91.     {_0, zBIT,"5,b"},   {_0, zBIT,"5,c"},   {_0, zBIT,"5,d"},   {_0, zBIT,"5,e"},
  92.     {_0, zBIT,"5,h"},   {_0, zBIT,"5,l"},   {_RM,zBIT,"5,(hl)"},{_0, zBIT,"5,a"},
  93.     {_0, zBIT,"6,b"},   {_0, zBIT,"6,c"},   {_0, zBIT,"6,d"},   {_0, zBIT,"6,e"},
  94.     {_0, zBIT,"6,h"},   {_0, zBIT,"6,l"},   {_RM,zBIT,"6,(hl)"},{_0, zBIT,"6,a"},
  95.     {_0, zBIT,"7,b"},   {_0, zBIT,"7,c"},   {_0, zBIT,"7,d"},   {_0, zBIT,"7,e"},
  96.     {_0, zBIT,"7,h"},   {_0, zBIT,"7,l"},   {_RM,zBIT,"7,(hl)"},{_0, zBIT,"7,a"},
  97.     {_0, zRES,"0,b"},   {_0, zRES,"0,c"},   {_0, zRES,"0,d"},   {_0, zRES,"0,e"},
  98.     {_0, zRES,"0,h"},   {_0, zRES,"0,l"},   {_WM,zRES,"0,(hl)"},{_0, zRES,"0,a"},
  99.     {_0, zRES,"1,b"},   {_0, zRES,"1,c"},   {_0, zRES,"1,d"},   {_0, zRES,"1,e"},
  100.     {_0, zRES,"1,h"},   {_0, zRES,"1,l"},   {_WM,zRES,"1,(hl)"},{_0, zRES,"1,a"},
  101.     {_0, zRES,"2,b"},   {_0, zRES,"2,c"},   {_0, zRES,"2,d"},   {_0, zRES,"2,e"},
  102.     {_0, zRES,"2,h"},   {_0, zRES,"2,l"},   {_WM,zRES,"2,(hl)"},{_0, zRES,"2,a"},
  103.     {_0, zRES,"3,b"},   {_0, zRES,"3,c"},   {_0, zRES,"3,d"},   {_0, zRES,"3,e"},
  104.     {_0, zRES,"3,h"},   {_0, zRES,"3,l"},   {_WM,zRES,"3,(hl)"},{_0, zRES,"3,a"},
  105.     {_0, zRES,"4,b"},   {_0, zRES,"4,c"},   {_0, zRES,"4,d"},   {_0, zRES,"4,e"},
  106.     {_0, zRES,"4,h"},   {_0, zRES,"4,l"},   {_WM,zRES,"4,(hl)"},{_0, zRES,"4,a"},
  107.     {_0, zRES,"5,b"},   {_0, zRES,"5,c"},   {_0, zRES,"5,d"},   {_0, zRES,"5,e"},
  108.     {_0, zRES,"5,h"},   {_0, zRES,"5,l"},   {_WM,zRES,"5,(hl)"},{_0, zRES,"5,a"},
  109.     {_0, zRES,"6,b"},   {_0, zRES,"6,c"},   {_0, zRES,"6,d"},   {_0, zRES,"6,e"},
  110.     {_0, zRES,"6,h"},   {_0, zRES,"6,l"},   {_WM,zRES,"6,(hl)"},{_0, zRES,"6,a"},
  111.     {_0, zRES,"7,b"},   {_0, zRES,"7,c"},   {_0, zRES,"7,d"},   {_0, zRES,"7,e"},
  112.     {_0, zRES,"7,h"},   {_0, zRES,"7,l"},   {_WM,zRES,"7,(hl)"},{_0, zRES,"7,a"},
  113.     {_0, zSET,"0,b"},   {_0, zSET,"0,c"},   {_0, zSET,"0,d"},   {_0, zSET,"0,e"},
  114.     {_0, zSET,"0,h"},   {_0, zSET,"0,l"},   {_WM,zSET,"0,(hl)"},{_0, zSET,"0,a"},
  115.     {_0, zSET,"1,b"},   {_0, zSET,"1,c"},   {_0, zSET,"1,d"},   {_0, zSET,"1,e"},
  116.     {_0, zSET,"1,h"},   {_0, zSET,"1,l"},   {_WM,zSET,"1,(hl)"},{_0, zSET,"1,a"},
  117.     {_0, zSET,"2,b"},   {_0, zSET,"2,c"},   {_0, zSET,"2,d"},   {_0, zSET,"2,e"},
  118.     {_0, zSET,"2,h"},   {_0, zSET,"2,l"},   {_WM,zSET,"2,(hl)"},{_0, zSET,"2,a"},
  119.     {_0, zSET,"3,b"},   {_0, zSET,"3,c"},   {_0, zSET,"3,d"},   {_0, zSET,"3,e"},
  120.     {_0, zSET,"3,h"},   {_0, zSET,"3,l"},   {_WM,zSET,"3,(hl)"},{_0, zSET,"3,a"},
  121.     {_0, zSET,"4,b"},   {_0, zSET,"4,c"},   {_0, zSET,"4,d"},   {_0, zSET,"4,e"},
  122.     {_0, zSET,"4,h"},   {_0, zSET,"4,l"},   {_WM,zSET,"4,(hl)"},{_0, zSET,"4,a"},
  123.     {_0, zSET,"5,b"},   {_0, zSET,"5,c"},   {_0, zSET,"5,d"},   {_0, zSET,"5,e"},
  124.     {_0, zSET,"5,h"},   {_0, zSET,"5,l"},   {_WM,zSET,"5,(hl)"},{_0, zSET,"5,a"},
  125.     {_0, zSET,"6,b"},   {_0, zSET,"6,c"},   {_0, zSET,"6,d"},   {_0, zSET,"6,e"},
  126.     {_0, zSET,"6,h"},   {_0, zSET,"6,l"},   {_WM,zSET,"6,(hl)"},{_0, zSET,"6,a"},
  127.     {_0, zSET,"7,b"},   {_0, zSET,"7,c"},   {_0, zSET,"7,d"},   {_0, zSET,"7,e"},
  128.     {_0, zSET,"7,h"},   {_0, zSET,"7,l"},   {_WM,zSET,"7,(hl)"},{_0, zSET,"7,a"}
  129. };
  130.  
  131. static z80gbdasm mnemonic_main[256]= {
  132.     {_0, zNOP,0},        {_0, zLD,"bc,N"},   {_WM,zLD,"(bc),a"}, {_0, zINC,"bc"},
  133.     {_0, zINC,"b"},     {_0, zDEC,"b"},     {_0, zLD,"b,B"},    {_0, zRLCA,0},
  134.     {_WM,zLD,"(W),sp"}, {_0, zADD,"hl,bc"}, {_RM,zLD,"a,(bc)"}, {_0, zDEC,"bc"},
  135.     {_0, zINC,"c"},     {_0, zDEC,"c"},     {_0, zLD,"c,B"},    {_0, zRRCA,0},
  136.     {_0, zSTOP,0},        {_0, zLD,"de,N"},   {_WM,zLD,"(de),a"}, {_0, zINC,"de"},
  137.     {_0, zINC,"d"},     {_0, zDEC,"d"},     {_0, zLD,"d,B"},    {_0, zRLA,0},
  138.     {_JR,zJR,"O"},      {_0, zADD,"hl,de"}, {_RM,zLD,"a,(de)"}, {_0, zDEC,"de"},
  139.     {_0, zINC,"e"},     {_0, zDEC,"e"},     {_0, zLD,"e,B"},    {_0, zRRA,0},
  140.     {_JR,zJR,"nz,O"},   {_0, zLD,"hl,N"},   {_WM,zLD,"(hl+),a"},{_0, zINC,"hl"},
  141.     {_0, zINC,"h"},     {_0, zDEC,"h"},     {_0, zLD,"h,B"},    {_0, zDAA,0},
  142.     {_JR,zJR,"z,O"},    {_0, zADD,"hl,hl"}, {_RM,zLD,"a,(hl+)"},{_0, zDEC,"hl"},
  143.     {_0, zINC,"l"},     {_0, zDEC,"l"},     {_0, zLD,"l,B"},    {_0, zCPL,0},
  144.     {_JR,zJR,"nc,O"},   {_0, zLD,"sp,N"},   {_WM,zLD,"(hl-),a"},{_0, zINC,"sp"},
  145.     {_RW,zINC,"(hl)"},  {_RW,zDEC,"(hl)"},  {_WM,zLD,"(hl),B"}, {_0, zSCF,0},
  146.     {_JR,zJR,"c,O"},    {_0, zADD,"hl,sp"}, {_RM,zLD,"a,(hl-)"},{_0, zDEC,"sp"},
  147.     {_0, zINC,"a"},     {_0, zDEC,"a"},     {_0, zLD,"a,B"},    {_0, zCCF,0},
  148.     {_0, zLD,"b,b"},    {_0, zLD,"b,c"},    {_0, zLD,"b,d"},    {_0, zLD,"b,e"},
  149.     {_0, zLD,"b,h"},    {_0, zLD,"b,l"},    {_RM,zLD,"b,(hl)"}, {_0, zLD,"b,a"},
  150.     {_0, zLD,"c,b"},    {_0, zLD,"c,c"},    {_0, zLD,"c,d"},    {_0, zLD,"c,e"},
  151.     {_0, zLD,"c,h"},    {_0, zLD,"c,l"},    {_RM,zLD,"c,(hl)"}, {_0, zLD,"c,a"},
  152.     {_0, zLD,"d,b"},    {_0, zLD,"d,c"},    {_0, zLD,"d,d"},    {_0, zLD,"d,e"},
  153.     {_0, zLD,"d,h"},    {_0, zLD,"d,l"},    {_RM,zLD,"d,(hl)"}, {_0, zLD,"d,a"},
  154.     {_0, zLD,"e,b"},    {_0, zLD,"e,c"},    {_0, zLD,"e,d"},    {_0, zLD,"e,e"},
  155.     {_0, zLD,"e,h"},    {_0, zLD,"e,l"},    {_RM,zLD,"e,(hl)"}, {_0, zLD,"e,a"},
  156.     {_0, zLD,"h,b"},    {_0, zLD,"h,c"},    {_0, zLD,"h,d"},    {_0, zLD,"h,e"},
  157.     {_0, zLD,"h,h"},    {_0, zLD,"h,l"},    {_RM,zLD,"h,(hl)"}, {_0, zLD,"h,a"},
  158.     {_0, zLD,"l,b"},    {_0, zLD,"l,c"},    {_0, zLD,"l,d"},    {_0, zLD,"l,e"},
  159.     {_0, zLD,"l,h"},    {_0, zLD,"l,l"},    {_RM,zLD,"l,(hl)"}, {_0, zLD,"l,a"},
  160.     {_WM,zLD,"(hl),b"}, {_WM,zLD,"(hl),c"}, {_WM,zLD,"(hl),d"}, {_WM,zLD,"(hl),e"},
  161.     {_WM,zLD,"(hl),h"}, {_WM,zLD,"(hl),l"}, {_0, zHLT,0},       {_WM,zLD,"(hl),a"},
  162.     {_0, zLD,"a,b"},    {_0, zLD,"a,c"},    {_0, zLD,"a,d"},    {_0, zLD,"a,e"},
  163.     {_0, zLD,"a,h"},    {_0, zLD,"a,l"},    {_RM,zLD,"a,(hl)"}, {_0, zLD,"a,a"},
  164.     {_0, zADD,"a,b"},   {_0, zADD,"a,c"},   {_0, zADD,"a,d"},   {_0, zADD,"a,e"},
  165.     {_0, zADD,"a,h"},   {_0, zADD,"a,l"},   {_RM,zADD,"a,(hl)"},{_0, zADD,"a,a"},
  166.     {_0, zADC,"a,b"},   {_0, zADC,"a,c"},   {_0, zADC,"a,d"},   {_0, zADC,"a,e"},
  167.     {_0, zADC,"a,h"},   {_0, zADC,"a,l"},   {_RM,zADC,"a,(hl)"},{_0, zADC,"a,a"},
  168.     {_0, zSUB,"b"},     {_0, zSUB,"c"},     {_0, zSUB,"d"},     {_0, zSUB,"e"},
  169.     {_0, zSUB,"h"},     {_0, zSUB,"l"},     {_RM,zSUB,"(hl)"},  {_0, zSUB,"a"},
  170.     {_0, zSBC,"a,b"},   {_0, zSBC,"a,c"},   {_0, zSBC,"a,d"},   {_0, zSBC,"a,e"},
  171.     {_0, zSBC,"a,h"},   {_0, zSBC,"a,l"},   {_RM,zSBC,"a,(hl)"},{_0, zSBC,"a,a"},
  172.     {_0, zAND,"b"},     {_0, zAND,"c"},     {_0, zAND,"d"},     {_0, zAND,"e"},
  173.     {_0, zAND,"h"},     {_0, zAND,"l"},     {_RM,zAND,"(hl)"},  {_0, zAND,"a"},
  174.     {_0, zXOR,"b"},     {_0, zXOR,"c"},     {_0, zXOR,"d"},     {_0, zXOR,"e"},
  175.     {_0, zXOR,"h"},     {_0, zXOR,"l"},     {_RM,zXOR,"(hl)"},  {_0, zXOR,"a"},
  176.     {_0, zOR,"b"},      {_0, zOR,"c"},      {_0, zOR,"d"},      {_0, zOR,"e"},
  177.     {_0, zOR,"h"},      {_0, zOR,"l"},      {_RM,zOR,"(hl)"},   {_0, zOR,"a"},
  178.     {_0, zCP,"b"},      {_0, zCP,"c"},      {_0, zCP,"d"},      {_0, zCP,"e"},
  179.     {_0, zCP,"h"},      {_0, zCP,"l"},      {_RM,zCP,"(hl)"},   {_0, zCP,"a"},
  180.     {_0, zRET,"nz"},    {_0, zPOP,"bc"},    {_JP,zJP,"nz,A"},   {_JP,zJP,"A"},
  181.     {_JP,zCALL,"nz,A"}, {_0, zPUSH,"bc"},   {_0, zADD,"a,B"},   {_JP,zRST,"V"},
  182.     {_0, zRET,"z"},     {_0, zRET,0},       {_JP,zJP,"z,A"},    {_0, zDB,"cb"},
  183.     {_JP,zCALL,"z,A"},  {_JP,zCALL,"A"},    {_0, zADC,"a,B"},   {_JP,zRST,"V"},
  184.     {_0, zRET,"nc"},    {_0, zPOP,"de"},    {_JP,zJP,"nc,A"},   {_0, zDB,"d3"},
  185.     {_JP,zCALL,"nc,A"}, {_0, zPUSH,"de"},   {_0, zSUB,"B"},     {_JP,zRST,"V"},
  186.     {_0, zRET,"c"},     {_0, zRETI,0},      {_JP,zJP,"c,A"},    {_0, zDB,"db"},
  187.     {_JP,zCALL,"c,A"},  {_0, zDB,"dd"},     {_0, zSBC,"a,B"},   {_JP,zRST,"V"},
  188.     {_WM,zLD,"(F),a"},  {_0, zPOP,"hl"},    {_WM,zLD,"(C),a"},  {_0, zDB,"e3"},
  189.     {_0, zDB,"e4"},     {_0, zPUSH,"hl"},   {_0, zAND,"B"},     {_JP,zRST,"V"},
  190.     {_0, zADD,"SP,B"},  {_JP,zJP,"(hl)"},   {_WM,zLD,"(W),a"},  {_0, zDB,"eb"},
  191.     {_0, zDB,"ec"},     {_0, zDB,"ed"},     {_0, zXOR,"B"},     {_JP,zRST,"V"},
  192.     {_RM,zLD,"a,(F)"},  {_0, zPOP,"af"},    {_RM,zLD,"a,(C)"},  {_0, zDI,0},
  193.     {_0, zDB,"f4"},     {_0, zPUSH,"af"},   {_0, zOR,"B"},      {_JP,zRST,"V"},
  194.     {_0, zLD,"sp,hl+B"},{_0, zLD,"sp,hl"},  {_RM,zLD,"a,(W)"},  {_0, zEI,0},
  195.     {_0, zDB,"fc"},     {_0, zDB,"fd"},     {_0, zCP,"B"},      {_JP,zRST,"V"}
  196. };
  197.  
  198. static char sign(INT8 offset)
  199. {
  200.     return (offset < 0)? '-':'+';
  201. }
  202.  
  203. static int offs(INT8 offset)
  204. {
  205.     if (offset < 0) return -offset;
  206.     return offset;
  207. }
  208.  
  209. /****************************************************************************
  210.  * Disassemble opcode at PC and return number of bytes it takes
  211.  ****************************************************************************/
  212. unsigned DasmZ80GB( char *buffer, unsigned pc )
  213. {
  214.     z80gbdasm *d;
  215.     const char *symbol, *src;
  216.     char *dst;
  217.     unsigned PC = pc;
  218.     INT8 offset = 0;
  219.     UINT8 op, op1;
  220.     UINT16 ea = 0;
  221.  
  222.     dst = buffer;
  223.     symbol = NULL;
  224.  
  225.     op = cpu_readop( pc++ );
  226.     op1 = 0; /* keep GCC happy */
  227.  
  228.     if( op == 0xcb )
  229.     {
  230.         op = cpu_readop(pc++);
  231.         d = &mnemonic_cb[op];
  232.     }
  233.     else
  234.     {
  235.         d = &mnemonic_main[op];
  236.     }
  237.  
  238.     if( d->arguments )
  239.     {
  240.         dst += sprintf(dst, "%-4s ", s_mnemonic[d->mnemonic]);
  241.         src = d->arguments;
  242.         while( *src )
  243.         {
  244.             switch( *src )
  245.             {
  246.             case '?':   /* illegal opcode */
  247.                 dst += sprintf( dst, "$%02x,$%02x", op, op1);
  248.                 break;
  249.             case 'A':
  250.                 ea = cpu_readop_arg(pc) + ( cpu_readop_arg((pc+1)&0xffff) << 8);
  251.                 pc += 2;
  252.                 symbol = set_ea_info(0, ea, EA_UINT16, d->access);
  253.                 dst += sprintf( dst, "%s", symbol );
  254.                 break;
  255.             case 'B':   /* Byte op arg */
  256.                 ea = cpu_readop_arg( pc++ );
  257.                 symbol = set_ea_info(1, ea, EA_UINT8, EA_VALUE);
  258.                 dst += sprintf( dst, "%s", symbol );
  259.                 break;
  260.             case '(':   /* Memory byte at (...) */
  261.                 *dst++ = *src;
  262.                 if( !strncmp( src, "(bc)", 4) )
  263.                 {
  264.                     ea = z80gb_get_reg( Z80GB_BC );
  265.                     set_ea_info(0, ea, EA_UINT8, d->access);
  266.                 }
  267.                 else
  268.                 if( !strncmp( src, "(de)", 4) )
  269.                 {
  270.                     ea = z80gb_get_reg( Z80GB_DE );
  271.                     set_ea_info(0, ea, EA_UINT8, d->access);
  272.                 }
  273.                 else
  274.                 if( !strncmp( src, "(hl)", 4) )
  275.                 {
  276.                     ea = z80gb_get_reg( Z80GB_HL );
  277.                     if( d->access == EA_ABS_PC )
  278.                         set_ea_info(0, ea, EA_DEFAULT, EA_ABS_PC);
  279.                     else
  280.                         set_ea_info(0, ea, EA_UINT8, d->access);
  281.                 }
  282.                 else
  283.                 if( !strncmp( src, "(sp)", 4) )
  284.                 {
  285.                     ea = z80gb_get_reg( Z80GB_SP );
  286.                     set_ea_info(0, ea, EA_UINT16, d->access);
  287.                 }
  288.                 else
  289.                 if( !strncmp( src, "(F)", 3) )
  290.                 {
  291.                     ea = 0xff00 + cpu_readop_arg( pc++ );
  292.                     symbol = set_ea_info(0, ea, EA_UINT8, d->access);
  293.                     dst += sprintf( dst, "%s", symbol );
  294.                     src++;
  295.                 }
  296.                 else
  297.                 if( !strncmp( src, "(C)", 3) )
  298.                 {
  299.                     ea = 0xff00 + (z80gb_get_reg( Z80GB_BC ) & 0xff);
  300.                     symbol = set_ea_info(0, 0xff00, EA_DEFAULT, EA_VALUE);
  301.                     set_ea_info(1, ea, EA_UINT8, d->access);
  302.                     dst += sprintf( dst, "%s+c", symbol );
  303.                     src++;
  304.                 }
  305.                 break;
  306.             case 'N':   /* Immediate 16 bit */
  307.                 ea = cpu_readop_arg(pc) + ( cpu_readop_arg((pc+1)&0xffff) << 8 );
  308.                 pc += 2;
  309.                 symbol = set_ea_info(1, ea, EA_UINT16, EA_VALUE );
  310.                 dst += sprintf( dst, "%s", symbol );
  311.                 break;
  312.             case 'O':   /* Offset relative to PC */
  313.                 offset = (INT8) cpu_readop_arg(pc++);
  314.                 symbol = set_ea_info(0, PC, offset + 2, d->access);
  315.                 dst += sprintf( dst, "%s", symbol );
  316.                 break;
  317.             case 'V':   /* Restart vector */
  318.                 ea = op & 0x38;
  319.                 symbol = set_ea_info(0, ea, EA_UINT8, d->access);
  320.                 dst += sprintf( dst, "%s", symbol );
  321.                 break;
  322.             case 'W':   /* Memory address word */
  323.                 ea = cpu_readop_arg(pc) + ( cpu_readop_arg((pc+1)&0xffff) << 8);
  324.                 pc += 2;
  325.                 symbol = set_ea_info(0, ea, EA_UINT16, d->access);
  326.                 dst += sprintf( dst, "%s", symbol );
  327.                 break;
  328.             default:
  329.                 *dst++ = *src;
  330.             }
  331.             src++;
  332.         }
  333.         *dst = '\0';
  334.     }
  335.     else
  336.     {
  337.         dst += sprintf(dst, "%s", s_mnemonic[d->mnemonic]);
  338.     }
  339.  
  340.     return pc - PC;
  341. }
  342.  
  343. #endif
  344.  
  345.